package com.example.bookmall.service.impl;




import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.bookmall.entity.Book;
import com.example.bookmall.entity.Cart;
import com.example.bookmall.entity.Result;
import com.example.bookmall.mapper.BookMapper;
import com.example.bookmall.mapper.CartMapper;
import com.example.bookmall.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements CartService {

    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private BookMapper bookMapper;

    @Override
    //  添加商品到购物车
    public boolean addToCart(Integer userId, Integer bookId, Integer quantity) {
        // 检查购物车中是否已存在该商品
        Cart cartItem = lambdaQuery()
                .eq(Cart::getUserId, userId)
                .eq(Cart::getBookId, bookId)
                .one();

        if (cartItem != null) {
            // 已存在，增加数量
            cartItem.setQuantity(cartItem.getQuantity() + quantity);
            cartItem.setUpdateTime(LocalDateTime.now());
            return updateById(cartItem);
        } else {
            // 不存在，新增记录
            Cart newItem = new Cart();
            newItem.setUserId(userId);
            newItem.setBookId(bookId);
            newItem.setQuantity(quantity);
            newItem.setAddTime(LocalDateTime.now());
            newItem.setUpdateTime(LocalDateTime.now());

            return save(newItem);
        }
    }


    // 获取购物车中的所有商品根据用户ID
    @Override
    public List<Cart> getCartItems(Integer userId) {

        return lambdaQuery()
                .eq(Cart::getUserId, userId)
                .list();
    }

    // 根据购物车ID列表批量获取购物车中的商品
    @Override
    public List<Cart> listByIds(List<Integer> cartIds) {

        return lambdaQuery()
                .in(Cart::getCartId, cartIds)
                .list();
    }



    // 根据用户ID和商品ID查找购物车中的商品
    @Override
    public Cart findCartById(Integer userId, Integer bookId) {
        return lambdaQuery()
                .eq(Cart::getUserId, userId)
                .eq(Cart::getBookId, bookId)
                .one();
    }


    // 删除购物车中的商品
    @Override
    public boolean removeFromCart(Integer cartId) {
        return lambdaUpdate()
                .eq(Cart::getCartId, cartId)
                .remove();
    }

    // 根据购物车ID列表批量删除购物车中的商品
    @Override
    public boolean removeByIds(List<Integer> cartIds,  Integer userId) {
        QueryWrapper<Cart> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("cart_id", cartIds)
                .eq("user_id", userId);

        int count = (int) count(queryWrapper);

        if (count != cartIds.size()) {
            throw new RuntimeException("存在不属于当前用户的购物车项");
        }

        return removeByIds(cartIds);
    }

    // 更新购物车中的商品数量
    @Override
    public boolean updateCartQuantity(Integer userId, Integer bookId, Integer quantity) {
        // 查询购物车中的商品
        Cart cartItem = lambdaQuery()
                .eq(Cart::getUserId, userId)
                .eq(Cart::getBookId, bookId)
                .one();

        if (cartItem == null) {
            throw new RuntimeException("购物车中没有该商品");
        }

        Book book = bookMapper.selectById(bookId);
        if(book.getStock()<quantity){
            throw new RuntimeException("库存不足,该商品无法再添加");
        }


        cartItem.setQuantity(quantity);
        cartItem.setUpdateTime(LocalDateTime.now());
        return updateById(cartItem);
    }


}
